package com.bolingcavalry.crm.user.util;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.InvalidKeyException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.*;

@Component
public class JwtUtil {

    @Value("${jwt.secret}") // 从配置文件读取密钥
    private String SECRET_KEY;

    @Value("${jwt.expiration}") // 过期时间（毫秒）
    private long EXPIRATION_TIME;

    // 生成 JWT Token
    public String createToken(String username, List<String> role, List<String> permissions) {
        // 设置签发时间
        Date now = new Date();
        // 设置过期时间
        Date expiryDate = new Date(now.getTime() + EXPIRATION_TIME);

        try {
            return Jwts.builder()
                    // 设置主题（用户名）
                    .setSubject(username)
                    // 自定义声明（角色信息）
                    .claim("role", role)
                    // 自定义声明（权限信息）
                    .claim("permissions", permissions)
                    // 签发时间、过期时间
                    .setIssuedAt(now)
                    .setExpiration(expiryDate)
                    // 签名算法和密钥
                    .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                    .compact();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
            throw new RuntimeException("Failed to create JWT token",e);
        }
    }

    // 解析 Token 获取用户名
    public String getUsernameFromToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }

    // 解析 Token 获取角色
// 修改返回类型为 List<String>
    public List<String> getRoleFromToken(String token) {
        Object role = Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .get("role");

        // 做类型判断确保安全
        if (role instanceof List<?>) {
            @SuppressWarnings("unchecked")
            List<String> roles = (List<String>) role;
            return roles;
        } else {
            // 可选处理：返回空列表或抛出异常，视业务需求而定
            return Collections.emptyList();
        }
    }


    // 验证 Token 是否有效
    public boolean validateToken(String token) {
        try {
            Jws<Claims> claims = Jwts.parser()
                    .setSigningKey(SECRET_KEY)
                    .parseClaimsJws(token);
            return !claims.getBody().getExpiration().before(new Date());
        } catch (JwtException | IllegalArgumentException e) {
            return false;
        }
    }

    // 获取 Token 中的声明信息
    public Claims getClaimsFromToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
    }

    // 解析 Token 获取权限列表
    public List<String> getPermissionsFromToken(String token) {
        try {
            Object permissions = Jwts.parser()
                    .setSigningKey(SECRET_KEY)
                    .parseClaimsJws(token)
                    .getBody()
                    .get("permissions");
            return permissions instanceof List ? (List<String>) permissions : Collections.emptyList();
        } catch (JwtException | IllegalArgumentException e) {
            return Collections.emptyList();
        }
    }
}